class Schedule {
  constructor(initMaxRun = 2) {
    this.initMaxRun = initMaxRun;
    this.taskList = [];
    this.runCount = 0;
  }
  add(task) {
    return new Promise((resolve, reject) => {
      this.taskList.push({ task, resolve, reject });
      this.run();
    });
  }
  run() {
    while (this.taskList.length > 0 && this.runCount < this.initMaxRun) {
      const { task, resolve, reject } = this.taskList.shift();
      this.runCount++;
      task()
        .then(resolve, reject)
        .finally(() => {
          this.runCount--;
          this.run();
        });
    }
  }
}

const taskSchedule = new Schedule();
function addTask(name, time) {
  taskSchedule
    .add(() => timeout(time))
    .then(() => {
      console.log(`${name}完成`);
    });
}

function timeout(time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, time);
  });
}
addTask("任务1", 1000);
addTask("任务2", 500);
addTask("任务3", 300);
addTask("任务4", 400);
addTask("任务5", 100);
// 任务2完成
// 任务3完成
// 任务1完成
// 任务5完成
// 任务4完成
